/********************************************************************************************************************************
 * 《C ++ Primer》第五版中文版，读书笔记：按照书中的的示例源码和每一个小章节的课后习题，自己动手写代码实现，作为联系和测试。
 * Date: 2024-04-15 16:42
 * Author: dimon.chen 
 * EMali: 1181302388@qq.com 
 * 
 * 章节: 第五章 
 *       5.6 try语句块和异常处理
 * 
 ********************************************************************************************************************************/


#include <iostream>
#include <string>
#include <vector>
#include <stdexcept>

using std::cout;
using std::endl;
using std::cin;
using std::string;
using std::vector;
using std::runtime_error;

int main(int argc, char *argv[])
{
    //
    // 5.6.3 节练习
    // 练习 5.23: 编写一段程序，从标注输入读取两个整数，输出第一个整数除以第二个整数的结果
    //

    int a;
    int b;

    cout << "Please enter to integert number:" << endl;
    cin >> a >> b;
    cout << "you enter " << a << " and " << b << endl;
    cout << "divide vlaue is :" << a/b << endl;


    //
    // 5.6.3 节练习
    // 练习 5.24: 修改你的程序，是的当第二个数是 0 时抛出异常。先不要设定 catch 子句，运行程序并真的输入除数为0，看看会发生什么？
    //
    cin >> a >> b;
    cout << "you enter " << a << " and " << b << endl;
    if(b == 0)
        throw runtime_error("the second number is 0");


    //
    // 5.6.3 节练习
    // 练习 5.25: 修改你的程序，使用try语句块去捕获异常。catch子句应该为用户输出一条提示信息，询问其是否输入新数并执行try语句块的内容
    //

    while(1){
        cout << "Please enter to integert number:" << endl;
        cin >> a >> b;
        try {
            if(b == 0)
                throw runtime_error("3, the second number is 0");
        } catch (runtime_error err) {
            cout << err.what() << endl;
            cout << "do you want to try again? Enter y or n" << endl;
            char c;
            cin >> c;
            if(!cin || c == 'n')
                break;
        }

        //break;
    }

    return 0;
}